package PolacaInversa;

import TokensDelLenguaje.Token;
import TokensDelLenguaje.Token_Registro;
import TokensDelLenguaje.Token_Struct;
import TokensDelLenguaje.Tokens;

public class BancoRegistros {
    
    public Registro[][] matriz;
    
    public BancoRegistros() {
        this.matriz = new Registro[4][2];
        this.matriz[0][0] = new Registro("bx", 2);
        this.matriz[0][1] = new Registro("ebx", 4);
        this.matriz[1][0] = new Registro("cx", 2);
        this.matriz[1][1] = new Registro("ecx", 4);
        this.matriz[2][0] = new Registro("dx", 2);
        this.matriz[2][1] = new Registro("edx", 4);
        this.matriz[3][0] = new Registro("ax", 2);
        this.matriz[3][1] = new Registro("eax", 4);
        
    }
    
    public Registro getLibre(Token t, Token o1, Token o2) {
        int tamaño = 2;
        if(o1.getId() == Tokens.const_ulongint || o2.getId() == Tokens.const_ulongint)
            tamaño = 4;
        if(t.getId() == Tokens.division)
            if(o2.getId() == Tokens.const_uinteger)
                tamaño = 2;
        else
                tamaño = 4;
        if(((Token)o2).esRegistro())
            if(((Token_Registro)o2).getRegistro().tamaño == tamaño)
                return ((Token_Registro)o2).getRegistro();
        if(((Token)o1).esRegistro())
            if(((Token_Registro)o1).getRegistro().tamaño == tamaño)
                return ((Token_Registro)o1).getRegistro();        
        if(t.getId() == Tokens.punto){
            tamaño = ((Token_Struct)o2).getTamano(o1);
        }
        if ( tamaño == 2 ) {
            for (int i=0; i<4; i++)
                if (this.matriz[i][0].libre){
                    this.matriz[i][0].libre = false;
                    this.matriz[i][1].libre = false;
                    return this.matriz[i][0];
                }
        }
        else if ( tamaño == 4 ) {
            for (int i=0; i<4; i++)
                if (this.matriz[i][1].libre){
                    this.matriz[i][1].libre = false;
                    this.matriz[i][0].libre = false;
                    return this.matriz[i][1];
                }
        }
        return null;
    }
    
    public void liberar(Registro r){
        for(int i=0; i<4; i++){
            for(int j=0; j<2; j++){
                if(this.matriz[i][j].nombre == r.nombre){
                    this.matriz[i][0].libre = true;
                    this.matriz[i][1].libre = true;
                }
            }
        }
    }
    
}
